{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Entity candidates"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Connection success.\n"
     ]
    }
   ],
   "source": [
    "# setup\n",
    "dataset_name = 'lcquad'\n",
    "\n",
    "import os\n",
    "os.chdir('/home/zola/Projects/KBQA/src')\n",
    "\n",
    "# connect to entity catalog indexed with Lucene \n",
    "from elasticsearch import Elasticsearch\n",
    "from urllib.parse import quote\n",
    "\n",
    "class IndexSearch:\n",
    "    \n",
    "    def __init__(self, index_name):\n",
    "        # set up ES connection\n",
    "        self.es = Elasticsearch()\n",
    "        self.index = index_name\n",
    "        self.type = 'terms'\n",
    "\n",
    "    def match_label(self, string, top=100):\n",
    "        return self.es.search(index=self.index,\n",
    "                              body={\"query\": {\"multi_match\": {\"query\": string,\n",
    "                                                              \"operator\": \"and\",\n",
    "                                                              \"fields\": [\"label^10\", \"label.ngrams\"],\n",
    "                                                              }}},\n",
    "                              size=top, doc_type=self.type)['hits']['hits']\n",
    "\n",
    "    def look_up_by_uri(self, uri, top=1):\n",
    "        results = self.es.search(index=self.index,\n",
    "                              body={\"query\": {\"term\": {\"uri\": quote(uri, safe='():/,')}}},\n",
    "                              size=top, doc_type=self.type)['hits']['hits']\n",
    "        if not results:\n",
    "            # fall back to label match\n",
    "            return self.match_label(uri.split('/')[-1], top=1)\n",
    "            \n",
    "        return results\n",
    "\n",
    "\n",
    "e_index = IndexSearch('dbpedia201604e')\n",
    "\n",
    "# set up connection to the MongoDB where the QA dataset is stored\n",
    "# sudo service mongod start (27017 is the default port)\n",
    "from pymongo import MongoClient\n",
    "import json\n",
    "import pprint\n",
    "\n",
    "class Mongo_Connector():\n",
    "    '''\n",
    "    Wrapper class for some of the pymongo functions: http://api.mongodb.com/python/current/tutorial.html\n",
    "    '''\n",
    "\n",
    "    def __init__(self, db_name, col_name):\n",
    "        # spin up database\n",
    "        self.mongo_client = MongoClient()\n",
    "        self.db = self.mongo_client[db_name]\n",
    "        self.col = self.db[col_name]\n",
    "        print(\"Connection success.\")\n",
    "    \n",
    "    def count_all_docs(self):\n",
    "        count = self.col.count_documents({})\n",
    "        print (\"%d docs\"%count)\n",
    "    \n",
    "    def load_json(self, json_file_path):\n",
    "        with open(json_file_path, \"r\") as json_file:\n",
    "            docs = json.load(json_file)\n",
    "        dataset_size = len(docs)\n",
    "        print (\"%d docs\"%(dataset_size))\n",
    "        self.col.insert_many(docs)\n",
    "\n",
    "    def show_example(self):\n",
    "        pprint.pprint(self.col.find_one())\n",
    "    \n",
    "    def get_sample(self, sample_size=100):\n",
    "        cursor = self.col.find()\n",
    "        if sample_size:\n",
    "            cursor = cursor.limit(sample_size)\n",
    "        return cursor\n",
    "\n",
    "mongo = Mongo_Connector('kbqa', dataset_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preparing lcquad dataset\n",
      "http://dbpedia.org/resource/Ys_I_&_II not found in the entity catalog\n",
      "http://dbpedia.org/resource/$24_in_24 not found in the entity catalog\n",
      "Loaded 2574 lcquad questions\n"
     ]
    }
   ],
   "source": [
    "# load lcquad samples from MongoDB\n",
    "limit = None\n",
    "qas = mongo.get_sample(limit)\n",
    "\n",
    "# prepare data for entity and predicate mention extraction models training via sequence tagging\n",
    "import urllib.parse\n",
    "from keras.preprocessing.text import text_to_word_sequence\n",
    "\n",
    "questions = []\n",
    "question_words = []\n",
    "n_words_distr = []\n",
    "\n",
    "correct_e_spans = []\n",
    "y_e = []\n",
    "correct_entities_uris = []\n",
    "correct_entities_ids = []\n",
    "\n",
    "correct_answers_uris = []\n",
    "correct_answers_ids = []\n",
    "\n",
    "print(\"Preparing %s dataset\"%dataset_name)\n",
    "for q in qas:\n",
    "#     pprint.pprint(q)\n",
    "    # parse question\n",
    "    question_o = q['question']\n",
    "    questions.append(question_o)\n",
    "    words = text_to_word_sequence(question_o)\n",
    "    n_words_distr.append(len(words))\n",
    "    question_words.append(words)\n",
    "\n",
    "    # generate IO tags from mention spans\n",
    "    entity_spans = [e['label'].lower() for e in q['entity mapping']]\n",
    "    correct_e_spans.append(entity_spans)\n",
    "    y_e.append([1 if word in [entity for entity_span in entity_spans for entity in entity_span.split()] else 0 for word in words])\n",
    "    \n",
    "    e_uris = [e['uri'].replace(\"'\", \"\") for e in q['entity mapping']]\n",
    "    correct_entities_uris.append(e_uris)\n",
    "    e_ids = [e_index.look_up_by_uri(uri, top=1)[0]['_source']['id'] for uri in e_uris]\n",
    "    correct_entities_ids.append(e_ids)\n",
    "    \n",
    "    a_uris = [e_uri.replace(\"'\", \"\") for e_uri in q['answers']]\n",
    "    correct_answers_uris.append(a_uris)\n",
    "    a_ids = []\n",
    "    for uri in a_uris:\n",
    "        try:\n",
    "            a_ids.append(e_index.look_up_by_uri(uri, top=1)[0]['_source']['id'])\n",
    "        except:\n",
    "            print(\"%s not found in the entity catalog\"%uri)\n",
    "    correct_answers_ids.append(a_ids)\n",
    "    \n",
    "dataset_size = len(questions)\n",
    "print(\"Loaded %d %s questions\"%(dataset_size, dataset_name))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "What is the common affiliation of the Monroe Carell Jr. Children's Hospital at Vanderbilt and alma mater of the Duncan U. Fletcher?\n",
      "[\"monroe carell jr. children's hospital at vanderbilt\", 'duncan u. fletcher']\n",
      "[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1]\n",
      "['http://dbpedia.org/resource/Monroe_Carell_Jr._Childrens_Hospital_at_Vanderbilt', 'http://dbpedia.org/resource/Duncan_U._Fletcher']\n",
      "[16583016, 9389949]\n",
      "['http://dbpedia.org/resource/Vanderbilt_University']\n",
      "[23223531]\n"
     ]
    }
   ],
   "source": [
    "# show sample question\n",
    "i = 5\n",
    "print(questions[i])\n",
    "print(correct_e_spans[i])\n",
    "print(y_e[i])\n",
    "print(correct_entities_uris[i])\n",
    "print(correct_entities_ids[i])\n",
    "print(correct_answers_uris[i])\n",
    "print(correct_answers_ids[i])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Correct spans\n",
    "\n",
    "Estimate the upper bound for entity scoring function performance on the correct entity spans"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Entity match recall estimated on 500 questions @5\n"
     ]
    }
   ],
   "source": [
    "# check if the correct entities are in the subgraph 1-hop away from the top entities\n",
    "# path to KG\n",
    "from hdt import HDTDocument\n",
    "hdt_path = \"/home/zola/Projects/hdt-cpp-molecules/libhdt/data/\"\n",
    "hdt_file = 'dbpedia2016-04en.hdt'\n",
    "namespace = \"http://dbpedia.org/\"\n",
    "\n",
    "\n",
    "def evaluate_entity_ranking(_e_spans, indices, top_n):\n",
    "    '''\n",
    "    Estimate ranking accuracy:\n",
    "    n_samples <int> size of the sample questions pool\n",
    "    top_n <int> threshold for the number of top entities \n",
    "    '''\n",
    "    n_correct_entities, n_correct_entities_1hop = 0, 0\n",
    "    n_correct_answers_1hop = 0\n",
    "    # match entities\n",
    "    for i in indices:\n",
    "        top_e_ids = []\n",
    "        \n",
    "        # entities index lookup\n",
    "        for span in _e_spans[i]:\n",
    "            for match in e_index.match_label(span, top=top_n):\n",
    "                top_e_ids.append(match['_source']['id'])\n",
    "        \n",
    "        if set(correct_entities_ids[i]).issubset(set(top_e_ids)):\n",
    "            n_correct_entities += 1\n",
    "        \n",
    "        # extract a subgraph for top entities\n",
    "        kg = HDTDocument(hdt_path+hdt_file)\n",
    "        # all predicates: 1 hop\n",
    "        kg.configure_hops(1, [], namespace, True)\n",
    "        entities, _, _ = kg.compute_hops(top_e_ids)\n",
    "        if set(correct_entities_ids[i]).issubset(set(entities)):\n",
    "            n_correct_entities_1hop += 1\n",
    "        if set(correct_answers_ids[i]).issubset(set(entities)):\n",
    "            n_correct_answers_1hop += 1\n",
    "        kg.remove()\n",
    "\n",
    "\n",
    "    r_entities = float(n_correct_entities) / n_samples\n",
    "    r_entities_1hop = float(n_correct_entities_1hop) / n_samples\n",
    "    r_answers_1hop = float(n_correct_answers_1hop) / n_samples\n",
    "    \n",
    "    return [r_entities, r_entities_1hop, r_answers_1hop]\n",
    "\n",
    "\n",
    "# define sample size for evaluation\n",
    "n_samples = 500\n",
    "top_n_range = [1, 5]\n",
    "print(\"Entity match recall estimated on %d questions @%d\"%(n_samples, top_n_range[1]))\n",
    "# shuffle dataset to get a random sample\n",
    "from random import shuffle\n",
    "index_shuf = list(range(dataset_size))\n",
    "shuffle(index_shuf)\n",
    "index_shuf = index_shuf[:n_samples]\n",
    "assert len(index_shuf) == n_samples"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       0      1      2\n",
      "0  0.000  0.000  0.000\n",
      "1  0.528  0.746  0.700\n",
      "2  0.666  0.836  0.776\n",
      "3  0.716  0.854  0.798\n",
      "4  0.738  0.878  0.808\n",
      "5  0.762  0.892  0.814\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAKvCAYAAABpkwknAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xl4XXW5//33WnvMPO0MnefSNqUTQykgYwsCMshQDnpQjgOoh0tR8Pz4oVw8DyB4RProQT0oMgjHoRQQkVGGo6hFRAUkKRRKp7SlSXbmZGeP6/v8sZKdsQPQZO8kn9d19Up21h6+uzvDJ3fu770sY4xBRERERGSCszO9ABERERGRbKBgLCIiIiKCgrGIiIiICKBgLCIiIiICKBiLiIiIiAAKxiIiIiIigIKxiIiIiAigYCwiIiIiAigYi4iIiIgACsYiIiIiIgB4M/nge/bsycjjhkIhwuFwRh5bRode44lBr/PEoNd5/NNrPDFk8nWePHnyQV1PFWMRERERERSMRUREREQABWMRERERESDDPcaDGWOIRqM4joNlWSP2OPX19cRisRG7fxk5xhhs2yYYDI7o54iIiIhMPFkVjKPRKD6fD693ZJfl9XrxeDwj+hgycpLJJNFolJycnEwvRURERMaRrGqlcBxnxEOxjH1erxfHcTK9DBERERlnsioY60/jcrD0uSIiIiKHWlYFYxERERGRTFEwHmTatGmsWbMm/e8HP/jBfq+/ceNGXnnllfTl+++/nw0bNgCwfv169u7dO6Lr7a+trY377rvvgNe78MILef3110d+QSIiIiJjiBp6BwkGgzz77LMHff2XXnqJvLw8jjrqKAA+9alPpY9t2LCBBQsWUFVVdcjXOZz29nbuv/9+LrvsslF5PBEREZHxRBXjg7Ry5Uq++93vcvrpp3PqqaeyZcsW6urqeOCBB7jrrrtYs2YNL7/8Mrfffjt33nknjz/+OK+//jpXXnkla9as4bnnnuOzn/1s+v5efPFFPve5zw37OLfeeitnn302Z5xxBm+88Qaf+MQnOPbYY7n//vsB6OrqYu3atem1PPPMMwDccsst7NixgzVr1nDTTTcB8KMf/YhTTz2V1atXc8stt6Qf5/HHH+ess87i+OOP5+WXXx7J/zoRERGRMSFrK8bOr+7C1G07pPdpTZuF/S+f3+91otEoa9asSV++8sorOffccwEoLS3lmWee4b777uPOO+/ku9/9Lpdeeil5eXl84QtfAOBPf/oTAB/72Me47777uP7661m6dCnGGG688UaampooKytj/fr1rF27dtg1TJ48md/+9rfccMMNfPWrX+XRRx8lFotx8skn86lPfYpAIMDdd99NQUEBzc3NnH322Zx22mlcd911bN68OV3xfuGFF3j66ad5/PHHycnJoaWlJf0YyWSSJ554gueff55169axfv36D/4fKyIiIjIOZG0wzpT9tVKcccYZACxZsoSnnnrqfd2vZVlccMEFPPzww1x88cX8/e9/5/vf//6w1z3ttNMAWLhwIZFIhPz8fPLz8wkEArS1tZGbm8u3v/1tXn75ZSzLYu/evTQ2Ng65nz/+8Y9cfPHF6Xm/JSUl6WNnnnlm+rns2rXrfT0XERERkfEoa4PxgSq7mRAIBADweDykUqn3ffuLL76Yyy67jEAgwMc+9rF9zmzufRzLsvD7/emP27ZNKpXikUceoampiaeeegqfz8fKlSuHPZOfMWafY81679fj8ZBMJt/3cxEREREZb9Rj/CHl5eXR2dl5UMeqqqqorKzkv/7rv/bZRnEwOjo6CIVC+Hw+/vznP6crvoMf78QTT+RXv/oV3d3dAANaKURERERkIAXjQXp7jHv/9d+wNpw1a9bw9NNPpzff9bd27VquvfZa1qxZkw6n559/PpMmTWL+/PkfeI3nn38+r7/+OmeccQa//vWvmTt3LuD2QB911FGccsop3HTTTZx88smcdtppnHHGGaxZs4Y777zzAz+miIiIyHhnGWNMph58z549Ay5HIhFyc3NH/HG9Xm/G2ge+8Y1vsHjxYi655JKMPP54caDPlVAoRDgcHsUVSSbodZ4Y9DqPf3qNJ4ZMvs6TJ08+qOupYjyKPvrRj/Lmm29y/vnnZ3opIiIiIjJI1m6+G4+efvrpTC9BRERERPZBFWMRERERERSMRUREREQABWMREREREUDBWEREREQEUDAe4mtf+xpLlizhlFNO2ed16urq9nt8NN11113pGckAl156KW1tbbS1tXHfffeN6lo2btzIK6+8st/rZNP/nYiIiEh/CsaDrF27lp///OeZXsZB++lPfzogGD/wwAMUFRXR3t7O/fffP6preemll/j73/8+qo8pIiIicqho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khGd8RQNnQk2tTWxq7G13+iwoT25nfF97DoD/B5rQICdletWcoeODutrXwh6LYVcGULBWEREREZEImVo7EpQ35Vgb0echq4EezsT1HcmqO+MDxt2A4NCbkWeb1CwHTpCLOC1M/DsZDxSMB7ka1/7Gs899xyhUIgXXnhh2OvU1dXx6U9/ep/HZaiamhrq6+s59dRT93u9efPm8c4774zSqkRE5MMwxtAaTbG3M94Tdt3g29AZZ29ngqZIckArg9e2qMjzUZXvY35ZIZX5PirzfcyfUgGxDgr8CrmSWQrGg6xdu5Z/+7d/4ytf+Uqml5JRyWQSr/fQfXrU1tbyz3/+84DBWEREskt3wqG+J/ju7XSrv/UdcfdtZ2LIGdJKc7xU5vtYXJlLZb6Pqnx/OgCX5niHnbYQCuUTDkdH6ymJ7JOC8SDHHHPMPk/53F8qleLrX/86f/vb36iqquKee+4hJyeHmpqa9JnvZsyYwe23305xcTEXXnghixYt4rXXXkuf+W758uUD7rOuro4vf/nL6VMn33zzzRx11FFs3LiRdevWUVJSwubNm1myZAl33HEHlmVxyy238Lvf/Q6v18sJJ5zAN77xDY4//ng2btxIe3s71dXVPPTQQxxzzDF8/OMfZ926dVRWVvLNb36Tt956i2QyydVXX83pp5/O+vXref7554nFYkQikQGne66rq+OTn/wkRx99NP/4xz9YtGgRa9eu5fbbbyccDvODH/yA5cuX8+qrr3LDDTcQjUYJBoOsW7eO6dOn893vfpdoNMpf//pXrrzySlavXs03v/lN/vnPf2JZFl/96lc566yzAPj2t7/Nc889RzAY5N5776W8vPwQvsIiItJfyjGEI/1bHNw2B7fym6Atlhpw/RyvTVWBj8kFflZMyqOyJ/hW5fsoz/Op4itjWtYG45p/RGhvTR34iu9DYbGHxSsOzZn1tm3bxg9/+ENuu+02rrjiCp588kkuuOACrrrqKm666SZWrVrFbbfdxrp167jxxhsB98xzjz32GH/5y1+4+uqrh7RihEIhfvnLXxIMBtm6dSv//u//zlNPPQW4rQgvvPACVVVVnHvuubzyyivMmzePp556ihdffBHLsmhra8Pj8TB79mzefvttdu7cyZIlS3j55ZdZvnw57733HrNmzeLWW2/luOOOY926dbS1tXHWWWfxkY98BIC/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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# evaluate on correct entity spans\n",
    "top_n = top_n_range[0]\n",
    "results = [[0, 0, 0]]  # recalls at 0\n",
    "while top_n <= top_n_range[1]:\n",
    "    results.append(evaluate_entity_ranking(correct_e_spans, index_shuf, top_n))\n",
    "    top_n += 1\n",
    "    \n",
    "# show result\n",
    "import pandas as pd\n",
    "results = pd.DataFrame(results)\n",
    "print(results)\n",
    "\n",
    "# plot\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use(\"ggplot\")\n",
    "plt.figure(figsize=(12,12))\n",
    "plt.plot(results[0], label='Entity match')\n",
    "plt.plot(results[1], label='1-hop entity match')\n",
    "plt.plot(results[2], label='1-hop answer match')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Extracted spans\n",
    "\n",
    "Estimate performance on the extracted entity spans using the mention extraction model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zola/anaconda3/envs/tf36/lib/python3.6/site-packages/keras_contrib/layers/crf.py:314: UserWarning: CRF.loss_function is deprecated and it might be removed in the future. Please use losses.crf_loss instead.\n",
      "  warnings.warn('CRF.loss_function is deprecated and it might be removed in the future. Please '\n",
      "/home/zola/anaconda3/envs/tf36/lib/python3.6/site-packages/keras_contrib/layers/crf.py:320: UserWarning: CRF.accuracy is deprecated and it might be removed in the future. Please use metrics.crf_accuracy\n",
      "  warnings.warn('CRF.accuracy is deprecated and it might be removed in the future. Please '\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_2 (InputLayer)         (None, 25)                0         \n",
      "_________________________________________________________________\n",
      "embedding_2 (Embedding)      (None, 25, 100)           711400    \n",
      "_________________________________________________________________\n",
      "bidirectional_2 (Bidirection (None, 25, 100)           60400     \n",
      "_________________________________________________________________\n",
      "time_distributed_2 (TimeDist (None, 25, 50)            5050      \n",
      "_________________________________________________________________\n",
      "crf_2 (CRF)                  (None, 25, 2)             110       \n",
      "=================================================================\n",
      "Total params: 776,960\n",
      "Trainable params: 65,560\n",
      "Non-trainable params: 711,400\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "# load pre-trained entity mention extraction model\n",
    "embeddings_choice = 'glove6B100d'\n",
    "\n",
    "from keras.models import Model, Input\n",
    "from keras.layers import LSTM, Embedding, Dense, TimeDistributed, Dropout, Bidirectional\n",
    "from keras_contrib.layers import CRF\n",
    "from keras.optimizers import Adam\n",
    "\n",
    "def build_model(model_settings):\n",
    "    # architecture\n",
    "    input = Input(shape=(model_settings['max_len'],))\n",
    "    model = Embedding(input_dim=model_settings['n_words']+1, output_dim=model_settings['emb_dim'],\n",
    "                      weights=[model_settings['embeddings']],\n",
    "                      input_length=model_settings['max_len'], mask_zero=True, trainable=False)(input)\n",
    "    model = Bidirectional(LSTM(units=50, return_sequences=True,\n",
    "                               recurrent_dropout=0.1))(model)  # variational biLSTM\n",
    "    model = TimeDistributed(Dense(50, activation=\"relu\"))(model)  # a dense layer as suggested by neuralNer\n",
    "    crf = CRF(model_settings['n_tags'])  # CRF layer\n",
    "    out = crf(model)  # output\n",
    "    model = Model(input, out)\n",
    "    model.compile(optimizer=Adam(lr=0.0001), loss=crf.loss_function, metrics=[crf.accuracy])\n",
    "    model.summary()\n",
    "    return model\n",
    "\n",
    "# load model settings\n",
    "import pickle as pkl\n",
    "with open('%s_%s.pkl'%(dataset_name, embeddings_choice), 'rb') as f:\n",
    "    model_settings = pkl.load(f)\n",
    "model = build_model(model_settings)\n",
    "\n",
    "# load weights\n",
    "model_name = 'entity_model'\n",
    "model.load_weights('model/'+model_name+'.h5')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy estimated on 2574 questions\n",
      "\n",
      "Acc: 0.52 \n"
     ]
    }
   ],
   "source": [
    "# evaluate entity span detection\n",
    "import numpy as np\n",
    "from keras.preprocessing.sequence import pad_sequences\n",
    "\n",
    "def evaluate_entity_span_extraction(show_errors=False):\n",
    "    n_correct = 0\n",
    "    questions_e_spans = []\n",
    "    for i, words in enumerate(question_words):\n",
    "        x_test_sent = pad_sequences(sequences=[[model_settings['word2idx'].get(w, 'unk') for w in words]],\n",
    "                                    padding=\"post\", value=0, maxlen=model_settings['max_len'])\n",
    "        p = model.predict(np.array([x_test_sent[0]]))\n",
    "        p = np.argmax(p, axis=-1)[0]\n",
    "\n",
    "        e_span, e_spans = [], []\n",
    "        for w, pred in zip(words, p):\n",
    "            if pred > 0:\n",
    "                e_span.append(w)\n",
    "            elif e_span:\n",
    "                e_spans.append(\" \".join(e_span))\n",
    "                e_span = []\n",
    "        # add last span\n",
    "        if e_span:\n",
    "            e_spans.append(\" \".join(e_span))\n",
    "            e_span = []\n",
    "\n",
    "        if set(correct_e_spans[i]) == set(e_spans):\n",
    "            n_correct += 1\n",
    "        elif show_errors:\n",
    "            print('\\n')\n",
    "            print(set(e_spans))\n",
    "            # show correct spans\n",
    "            print(set(correct_e_spans[i]))\n",
    "        questions_e_spans.append(e_spans)\n",
    "    p = float(n_correct) / dataset_size\n",
    "    print(\"\\nAcc: %.2f \"%(p))\n",
    "    return questions_e_spans\n",
    "\n",
    "# evaluate\n",
    "print(\"Accuracy estimated on %d questions\"%(dataset_size))\n",
    "extracted_e_spans = evaluate_entity_span_extraction()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       0      1      2\n",
      "0  0.000  0.000  0.000\n",
      "1  0.416  0.608  0.610\n",
      "2  0.520  0.694  0.680\n",
      "3  0.558  0.718  0.700\n",
      "4  0.574  0.732  0.714\n",
      "5  0.596  0.750  0.724\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAsYAAAKvCAYAAABpkwknAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvIxREBQAAIABJREFUeJzs3Xl8lNXdx/3PNUtmsu8hCZvsCAiCKJsbAu5WW5XWti7VVrvYaqvtY6vevB73+7by2Fp7t7UsxaVS1FrrLnq3LihicQMVQRACCWTfM+t1nj8mmSQQCEuSmUm+79eLV2ZyXTPXmZyQfHPmd86xjDEGEREREZEBzhHrBoiIiIiIxAMFYxERERERFIxFRERERAAFYxERERERQMFYRERERARQMBYRERERARSMRUREREQABWMREREREUDBWEREREQEUDAWEREREQHAFcuLl5aWxuS6eXl5VFZWxuTa0jfUxwOD+nlgUD/3f+rjgSGW/VxcXHxQ52nEWEREREQEBWMREREREUDBWEREREQEiHGN8d6MMfh8PmzbxrKsXrvOnj178Pv9vfb80nuMMTgcDrxeb69+j4iIiMjAE1fB2Ofz4Xa7cbl6t1kulwun09mr15DeEwqF8Pl8JCcnx7opIiIi0o/EVSmFbdu9Hool8blcLmzbjnUzREREpJ+Jq2Cst8blYOl7RURERHpaXAVjEREREZFYUTDey9ChQ1mwYEH03+9+97sDnr9mzRrWrVsXvb9ixQpWrVoFwMqVK9m9e3evtrejuro6li9f3u15F110ER9++GHvN0hEREQkgaigdy9er5dXXnnloM9/++23SU1N5fjjjwfgsssuix5btWoV48ePp7CwsMfb2ZX6+npWrFjBFVdc0SfXExEREelPNGJ8kGbMmMGvf/1rzjjjDObNm8eWLVsoKSnh4Ycf5qGHHmLBggWsXbuW++67jz/84Q88++yzfPjhh1x77bUsWLCA1atXc9VVV0Wf7/XXX+e73/1ul9e5++67Oe+88zjrrLP4+OOP+eY3v8ns2bNZsWIFAE1NTSxcuDDalpdeegmAu+66i+3bt7NgwQJuv/12AH7/+98zb9485s+fz1133RW9zrPPPss555zDiSeeyNq1a3vzSyciIiKSEOJ2xNh+/CFMybYefU5r6Agc3/jeAc/x+XwsWLAgev/aa6/l/PPPByAnJ4eXXnqJ5cuX84c//IFf//rXXHrppaSmpvL9738fgDfffBOAc889l+XLl3PrrbcyZcoUjDHcdtttVFVVkZuby8qVK1m4cGGXbSguLuaf//wnixYt4qc//SlPP/00fr+fuXPnctlll+HxeFiyZAnp6elUV1dz3nnncfrpp/OrX/2KTZs2RUe8X3vtNV588UWeffZZkpOTqampiV4jFArx3HPP8eqrr7J48WJWrlx5+F9YERERkX4gboNxrByolOKss84CYPLkybzwwguH9LyWZXHhhRfy5JNP8vWvf53//Oc//OY3v+ny3NNPPx2Ao48+mubmZtLS0khLS8Pj8VBXV0dKSgr33HMPa9euxbIsdu/eTUVFxT7P88Ybb/D1r389ut5vdnZ29NjZZ58dfS07d+48pNciIiIi0h/FbTDubmQ3FjweDwBOp5NwOHzIj//617/OFVdcgcfj4dxzz93vms1t17Esi6SkpOjnHQ4H4XCYp556iqqqKl544QXcbjczZszocic/Y8x+lzVre16n00koFDrk1yIiIiLS36jG+AilpqbS2Nh4UMcKCwsZNGgQv/3tb/dbRnEwGhoayMvLw+1289Zbb0VHfPe+3imnnMLjjz9OS0sLQKdSChERERHpTMF4L201xm3/Ok5Y68qCBQt48cUXo5PvOlq4cCE33XQTCxYsiIbTr33taxQVFTF27NjDbuPXvvY1PvzwQ8466yz+/ve/M3r0aCBSA3388cdz2mmncfvttzN37lxOP/10zjrrLBYsWMAf/vCHw76miIiISH9nGWNMrC5eWlra6X5zczMpKSm9fl2XyxWz8oGbb76ZSZMmcckll8Tk+v1Fd98reXl5VFZW9mGLJBbUzwOD+rn/Ux8PDLHs5+Li4oM6TyPGfejMM8/k008/5Wtf+1qsmyIiIiIie4nbyXf90YsvvhjrJoiIiIjIfmjEWEREREQEBWMREREREUDBWEREREQEUDAWEREREQEUjPfxs5/9jMmTJ3Paaaft95ySkpIDHu9LDz30UHSNZIBLL72Uuro66urqWL58eZ+2Zc2aNaxbt+6A58TT105ERESkIwXjvSxcuJBHH3001s04aH/+8587BeOHH36YzMxM6uvrWbFiRZ+25e233+Y///lPn15TREREpKdouba9zJw5k5KSkm7PC4fD/PznP+e9996jsLCQpUuXkpyczIYNG7jpppvw+XwMHz6c++67j6ysLC666CImTJjABx98QGNjI/fddx9Tp07d5znvuusu3n77bQKBAJdffjmXXnopa9asYfHixWRnZ7Np0yYmT57MAw88wNKlS9mzZw8XX3wx2dnZPPHEE8yYMYMXXniBu+66i+3bt7NgwQJOPvlkysvLOffccznjjDMAuPbaa/nKV77C6aefHr3+mjVruO+++8jLy2Pjxo2cffbZjB8/niVLluDz+ViyZAlHHXUUL7/8Mr/97W8JBAJkZ2fzu9/9Dp/Px8MPP4zT6eTJJ5/kjjvuYOTIkdx0001s374dgLvvvpvCwsL9fu1EREREYilug/Gf39vDthpfjz7niGwv350+qEeea9u2bTz44IPce++9XHPNNTz//PNceOGFXH/99dx+++3MmjWLe++9l8WLF3PbbbcB0NLSwjPPPMM777zDDTfcwGuvvdbpOf/617+Snp7O888/j9/v54ILLuCUU04BYMOGDbz22msUFhZy/vnns27dOq666ir+9Kc/sWrVKnJycjo9169+9Ss2bdrEK6+8AkRGcx966CHOOOMM6uvree+997j//vv3eV2ffPIJ//rXv8jKymL27NlccsklPPfcc/z5z39m6dKl3HbbbZxwwgn885//xLIsHnvsMX7/+9+zaNEiLr30UlJTU/n+978PwPe//31mzpzJkiVLCIfDNDU1UVdXt9+vnYiIiEgsxW0wjndDhw5l0qRJAEyePJmSkhLq6+upq6tj1qxZAFx88cVcc8010cecf/75QGRUuqGhgbq6OjIzM6PH//3vf/Ppp5/y3HPPAdDQ0MC2bdtwu90ce+yx0e0MJ06cSElJCSeccMJBt3fWrFncfPPNVFZW8vzzz3P22Wfjcu3b/VOmTGHQoMgfD8OHD48G8/Hjx7NmzRoAysrK+MEPfkB5eTmBQIBhw4Z1ec233nqL3/zmNwA4nU4yMjKoq6vr8msnIiIi/YMxhsaATUVTkIrmIJVNISqaggQdNXzv2OxYN++A4jYY99TIbk/YtWsXV1xxBRCZ3DZ37lw8Hk/0uNPpxOfrfnTbsqwD3ge44447OPXUUzt9bs2aNSQlJXW6XigUOoRXEHHhhRfy1FNP8cwzz3Dfffd1eU7H6zgcjuh9h8MRveatt97K1Vdfzemnnx4t8zgUh/O1ExERkfgQDNtUNkfCbvvHIBVN7bd9IdPpMW6HxaB0D8FjsnA7980/8SJug3E8GTx4cLQkAdjvCGdGRgaZmZmsXbuWGTNm8OSTTzJz5szo8WeeeYY5c+bw7rvvkpGRQUZGRqfHn3LKKaxYsYI5c+bgdrv54osvKCoqOmDb0tLSaGxs3KeUIjU1lcbGxk6fW7hwIeeccw4FBQWMGzfuoF57V+rr6yksLARg1apV+73miSeeyIoVK/je975HOBymubn5sK8pIiIivc8YQ70/HAm5zUEqm4KtI7+tobcpSI0vvM/jsrxO8lPdDM30MK04lfxUN/kpbvJSXeSnusn0OMnPz6eysjIGr+rgKRjv5Yc//CFvv/021dXVHHfccdx4441ccsklB/34+++/Pzr5btiwYZ1GU7OysvjKV74SnXy3t29+85uUlJRw5plnYowhJyeHpUuXHvB63/rWt/j2t79NQUEBTzzxRPTzOTk5HH/88Zx22mnMnTuXW2+9lfz8fMaMGROdgHe4brjhBq655hoKCwuZNm1a9A+FBQsWcM011/DSSy9xxx13cNttt/GLX/yCxx9/HIfDwd133x0t0xAREZG+5w/Ze43yBjuF4MrmEIFw59HeJKdFQaqbvFQ3R2V5yEt1k58SCbz5qW5yU1wkOfvHQmeWMcZ0f1rvKC0t7XS/ubmZlJSUXr+uy+U6rFKEI3HRRRdx6623MmXKlD69bkctLS3MmzePF198cZ/R6kTT3fdKXl5e3P9VKkdO/TwwqJ/7P/Vxz7CNodYXjo7sRut7W8scKpuC1Pk7j/ZaQHayi/xUF3kp7taw6yK/9XZeqpv0JEeX5Z+HKpb93DZPqzsaMR4gXn/9dW644QauvvrqhA/FIiIiA1FL0I6O8raN+raVOVS2jgCH7M6P8bocFLSWM4zO8UZCb4cyh5xkd1zX/PY1BeM+0rHMIRZOPvnkbnelExERkdgI24YaXyha2tA24lvRFIqG4cZA59TrsCA3ORJ0x+YmM3tYejT05qe6yEt1k+rumdHegULBWERERKSXNQXCe63i0D7iW9kcuW/vVdyamuSIhtzxecnRmt78lEjozUl24XQo9PYkBWMRERGRIxCyDdXNbbW8Het62283BzuP9jotopPYJhSkRGt622p981JdpLidMXpFA5eCsYiIiMh+7G+zio4T2mp8+472Znic5KW4KEx3M6kwpdMqDnkpLrK8Gu2NRwrGIiIiMmDtvVlFx9re/W1W4XJY0ZUbphSl7rWKQ+S2x9U/li8baBSM9/Kzn/2M1atXk5eXx2uvvdblOSUlJVx++eX7PS772rBhA3v27GHevHkHPG/MmDFs3ry5j1olIiL9WU9sVjG1ODVa59s2sS3D68ShCW39koLxXhYuXMh3vvMdrrvuulg3JaZCoRAuV899e2zcuJGPPvqo22AsIiJysA53s4q2CWzDB6dFb/fHzSrk0CkY72XmzJn73fK5o3A4zM9//nPee+89CgsLWbp0KcnJyWzYsCG6893w4cO57777yMrK4qKLLmLChAl88MEH0Z3vpk6d2uk5S0pK+MlPfhLdOvmOO+7g+OOPZ82aNSxevJjs7Gw2bdrE5MmTeeCBB7Asi7vuuouXX34Zl8vFySefzM0338yJJ57ImjVrqK+vZ+LEiTzxxBPMnDmTr371qyxevJhBgwZxyy238NlnnxEKhbjhhhs444wzWLlyJa+++ip+v5/m5uZO2z2XlJTwrW99ixNOOIH169czYcIEFi5cyH333UdlZSW/+93vmDp1Ku+//z6LFi3C5/Ph9XpZvHgxw4YN49e//jU+n493332Xa6+9lvnz53PLLbfw0UcfYVkWP/3pTznnnHMAuOeee1i9ejVer5dly5aRn5/fgz0sIiKJ4Eg3qxiR7eWEIXttVpHiIt3j1PJlsl9xG4w3rG+mvnbftzeOREaWk0nTemZnvW3btvHggw9y7733cs011/D8889z4YUXcv3113P77bcza9Ys7r33XhYvXsxtt90GRHaee+aZZ3jnnXe44YYb9inFyMvL469//Ster5etW7fyox/9iBdeeAGIlCK89tprFBYWcv7557Nu3TrGjBnDCy+8wOuvv45lWdTV1eF0Ohk5ciSff/45O3bsYPLkyaxdu5apU6dSVlbGiBEjuPvuu5kzZw6LFy+mrq6Oc845h5NOOgmA//znP6xevZrs7Ox9XvOXX37JH//4R/7nf/6Hs88+m6effpqnn36al19+mQceeIClS5cyevRonnrqKVwuF6+//jr//d//zUMPPcSNN97IRx99xJ133gnAnXfeSXp6Oq+++ioAtbW1QGRHu2nTpnHTTTdxxx138Oijj3L99df3SJ+JiEh8CIRtalvC1PpC1PhC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\n",
      "text/plain": [
       "<Figure size 864x864 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# evaluate on correct entity spans\n",
    "top_n = top_n_range[0]\n",
    "results = [[0, 0, 0]]  # recalls at 0\n",
    "while top_n <= top_n_range[1]:\n",
    "    results.append(evaluate_entity_ranking(extracted_e_spans, index_shuf, top_n))\n",
    "    top_n += 1\n",
    "    \n",
    "# show result\n",
    "import pandas as pd\n",
    "results = pd.DataFrame(results)\n",
    "print(results)\n",
    "\n",
    "# plot\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.style.use(\"ggplot\")\n",
    "plt.figure(figsize=(12,12))\n",
    "plt.plot(results[0], label='Entity match')\n",
    "plt.plot(results[1], label='1-hop entity match')\n",
    "plt.plot(results[2], label='1-hop answer match')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tf36",
   "language": "python",
   "name": "tf36"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
